package dancereal;

import Exercise.J21_PublicClass;

public class J21_AccessModifier {

	/* 캡슐화 encapsulation 과 접근 제어
	 * OOP의 원칙에서 캡슐화는
	 * 객체의 일부를 "보호"하고
	 * 노출해도 상관없는 부분을 노출했을 떄에는
	 * "안전"해야 한다는 매커니즘 
	 *
	 * 예를 들어, 텔레비젼은 캡슐화의 좋은 예임
	 * 텔레비젼의 수많은 부품들은 케이스 안에 놓아둠
	 * 클래스 개발자는 변수와 메서드들을 외부로부터 
	 * 감춰두어야 함
	 * 
	 * 자바는 접근 제어를 통해 캡슐화를 지원함
	 * 접근 제어의 종류에는 4가지가 존재
	 * private : 자신만 접근 가능, 그외는 접근 불가
	 * protected : 상속관계의 클래스만 접근 가능 
	 * public : 어디서나 접근 가능함을 의미
	 * default : 기본 패키지 내 클래스들끼리만 접근가능
	 * 
	 * 클래스에 적용 : public, default 만 사용 가능
	 * 멤버변수에 적용 : public, protected, private, default 
	 * 메서드에 적용 : public, protected, private, default
	 * 
	 */
	
	public static void main(String[] args) {
	   /* default 클래스 불러오기(실패!)
		* default 패키지에 선언된 클래스는
		* 같은 패키지내에 존재하는 클래스만이 접근가능
		* dancereal 패키지에서 default 패키지로는
		* 접근이 안됨
		*
		  J21_DefaultClass dfc = new J21_DefaultClass();
		*
		* J21_PublicClass 클래스가 public 이라 하더라도
		* default 패키지 내에 있으므로 접근 불가
		* J21_PublicCLass pbc = new J21_PublicClass();
		*
		* J21_Public 클래스는 public 이기 때문에
		* 어떤 패키지라도 접근 가능 
		*/ 
		 J21_Public pb = new J21_Public(); // dancereal
		 J21_PublicClass  pbc = new J21_PublicClass(); // exercise
		 
		 J21_Public pb1 = new J21_Public();
		 Exercise.J21_PublicClass pbc2 = new Exercise.J21_PublicClass();
		 
		 // 클래스의 멤버변수에 접근
		 // 같은 패키지내 멤버변수 접근 pbc1
		 pb1.defaultval = 1;
		 pb1.publicval = 2;
		 //pb.privateval = 3;
		 
		 // 다른 패키지내 클래스의 멤버변수 접근 pbc2
		 //pbc2.defaultval = 4;
		 pbc2.publicval = 5;
		 //pbc2.privateval = 6;
		 
		 // 같은 패키지
		// pb1.publicMethod();
		 //pb1.defaultMsethod();
		 //pb1.privateMethod();
		 
		 // 다른 패키지내 클래스의 멤버변수 접근 
		 pbc2.publicMethod();
		 //pbc2.privateMethod();
		 //pbc2.defaultMethod();
		 
		 /*결론
		  * OOP 캡슐화 원칙에 따라
		  * 클래스의 멤버변수들은 무조건 private 선언
		  * 클래스의 메서드들은 외부에 노출하려면
		  * public 으로 선언하고, 그외의 경우에는
		  * protected 로 선언  
		  *  
		  */
		 
		 
	}

}
